package Day18.Inner03;

/**
 * @author HYHwtx
 * @version 1.0
 * @date 2022/2/25 15:43
 */
/**
 * 2.匿名内部类的语法比较奇怪，注意：因为匿名内部类既是一个类的定义，同时他也是一个对象，从语法上看，有定义类的特征
 * 也有创建对象的特征，早上的代码都有这个特点，因此我们可以调用匿名内部类的方法
 */
public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        //第一种调用方法
        Outer05 outer05=new Outer05();
        outer05.f1();
        //7.外部其他类不能访问匿名内部类(因为你这个匿名内部类地位是一个局部变量)
    }
}
class Outer05 {
    private int n1 = 99;

    public void f1() {
        //创建一个基于类的匿名内部类
        //4.不能添加一个访问修饰符，因为他的地位就是一个局部变量
        //5.作用域：仅仅就是在他的方法或者代码块中，剩下的哪里都用不了
        Person person = new Person() {
            @Override
            public void hi() {
                System.out.println("匿名类重写了hi方法");
                //3.可以直接访问外部类的所有成员，包括私有的。
                //6.匿名内部类可以访问外部类的成员，直接访问
                System.out.println("调用n1的值n1=" + n1);
                //8.如果外部类和内部类重名的话，匿名内部类访问的话，默认遵循就近原则，如果我想访问外部类的成员，
                // 则可以使用(外部类.this.成员)去访问
                System.out.println("外部类的n1=" + Outer05.this.n1);

            }
        };
        person.hi();//动态绑定，真实的编译类型是Outer05
        //也可以直接调用，匿名内部类本身就是返回了一个对象
        //class匿名内部类 extends Person
        new Person() {
            @Override
            public void hi() {
                System.out.println("匿名类重写了hi方法 哈哈哈");

            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        }
                .ok("ktm");

    }

    class Person {
        public void hi() {
            System.out.println("person里面的方法");

        }

        public void ok(String str) {
            System.out.println("person ok");
        }
    }
}
